package org.dei.perla.sys.query.llqruntime.datastructures;

import java.util.HashMap;

/**
 * Classe che rappresenta la struttura di un record (di un buffer qualsiasi)
 * @author Camplani, Fortunato, Marelli, Rota et al.
 *
 */
public class QueryRecordStructure {
	private HashMap <String, QueryFieldStructure> pRecordStructure;
	private int pIndex;
	private int pIndexTimestamp;
	
	/**
	 * Costruttore
	 */
	public QueryRecordStructure(){
		pRecordStructure = new HashMap <String, QueryFieldStructure>();
		pIndex = 0;
		pIndexTimestamp = -1;
	}
	
	/**
	 * Ritorna l'indice a cui è collocato il Field "TimeStamp"
	 * @return l'indice
	 */
	public int getIndexTimestamp(){
		if (pIndexTimestamp == -1)
			pIndexTimestamp = getIndexByName("timestamp");
		
		return pIndexTimestamp;
	}
	
	
	/**
	 * Aggiunge un Field alla struttura di un record
	 * @param parFieldName
	 * @param parFieldType
	 */
	public void addFieldStructure(String parFieldName, Class<?> parFieldType){
		
		QueryFieldStructure tQueryFieldStructure;
		
		tQueryFieldStructure = new QueryFieldStructure(parFieldType, parFieldName, pIndex);
		
		this.pRecordStructure.put(parFieldName, tQueryFieldStructure);
		pIndex++;
	}
	
	/**
	 * Restituisce l'indice dell'elemento con il nome passato come parametro
	 * @param parFieldName il nome dell'elemento di cui si vuole ottenere l'indice
	 * @return l'indice
	 */
	public int getIndexByName(String parFieldName){
		
		return this.pRecordStructure.get(parFieldName).getFieldIndex();
		
	}
	
	
	/**
	 * Restituisce il numero dei campi componenti un record
	 */
	public int getSize(){
		return this.pRecordStructure.size();
	}
	
	
	/**
	 * Restituisce la struttura di un record del buffer
	 * @return Hashmap
	 */
	public HashMap<String,QueryFieldStructure> getRecordStructure() {
		
		return this.pRecordStructure;
		
	}

}
